DockerでLaravel動かす
概要
まずToDoをまとめると、
・Docker入れる
・適当にphpとMySQLのimage用意する
・それらのコンテナ起動
・phpコンテナにLaravel入れる
・適当なLarabelプロジェクト作る
・アクセス
参考。
http://qiita.com/kukimo/items/c044ad42fffac062e2f5
絶対に絶対にPHP書きたくないがなんか特定の認証について知りたいのでやってみる。
Lamp環境入れる
docker run -p 80:80 --name php -d php:5.6-apache
こんな感じで。
Apacheっていうのが気にくわんがまあいいや。
起動しているプロセスの情報は、docker ps -a で確認できる。
Docker内のフォルダをhostとshareする
できるっぽいな?
っていうかそれできないと辛くてな。
-> exec コマンドがあるおかげで、なんか楽になってるっぽいぞ。ふむ?
-> Dockerから手元のフォルダを指す方法があった。これでいいな、、、
手元に適当なフォルダを作り、
/Users/tartetatin/Desktop/LaravelServer
docker run で、コンテナ内の特定のパスを、ホストの特定のパスと接続する。
docker run -p 80:80 -v /Users/tartetatin/Desktop/LaravelServer:/var/www/html --name php -d php:5.6-apache
これで、/var/www/htmlはapacheのデフォルトのドキュメントルートなので、ホストからDockerへのhttpリクエスト時に手元のフォルダが差されるようになった。
楽ジャーーーーン。
ホスト<->コンテナ間のファイルコピー
http://qiita.com/gologo13/items/7e4e404af80377b48fd5
双方向でできるようになってた。
わーーーい!!
コンテナを起動する
nameがかぶるんで、古いやつを適当に消さないといけない感じがする。
nameの概念を忘れた。なんだっけ、、
name -> imageから作成されたcontainerにつけられてるid。
containerはimageから生成され、起動中/終了中 などの状態を持っているので、nameで個々を区別する。
docker start name
で、すでに作成されたコンテナを起動できる。
docker run -> imageからcontainerを作る
docer start/stop container -> containerを起動したり停めたり
containerを指定するには、nameをつけておくといいよねっていう感じ。
作成したコンテナにTerminalで入る
docker exec -ti mysql bash
なんかかなり楽になってない? いいね~~
Dockerfile作ってPHPの入ってるコンテナを作り直す
適当なパスにDockerfile作る。
touch /Users/tartetatin/Desktop/LaravelServer/Dockerfile
Dockerfile
FROM php:5.6-apache
RUN apt-get update && docker-php-ext-install pdo_mysql mysqli mbstring
zip入れてcomposer入れてcomposerを移動してる。
それを元に、新たにPHPコンテナ立ち上げ。
docker build -t php:custom /Users/tartetatin/Desktop/LaravelServer/
なるほどな~~これで特定のimageをもとに、特定の構成で立ち上げられるimageが作成される。
MySQLの言語設定をUTF-8にして立ち上げる
なんか世知辛い事情によって、MySQLの文字コードはデフォルトではLatinらしい。
で、/Users/tartetatin/Desktop/LaravelServer/mysql/conf.dを作っておいて、MySQLの起動時に呼ばれるファイルの代わりに読み込ませる。
docker run --name mysql -v /Users/tartetatin/Desktop/LaravelServer/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7
PHPとMySQLのコンテナを立ち上げて協調動作させる
先ほど作ったphp:customと、mysql:mysql を協調動作させる。
MySQLのコンテナはlinkで立ち上がるわけでは無いみたいだ。事前に立ち上げておかないといけないのか、、なんか方法がないのかな。
docker run -p 80:80 -v /Users/tartetatin/Desktop/LaravelServer:/var/www/html --link mysql:mysql --name php -d php:custom
で、立ち上がっているコンテナ一覧は、
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd0ee19fa1f2 php:custom "apache2-foreground" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp php
aa9bed662161 mysql:5.7 "docker-entrypoint.sh" 24 minutes ago Up 24 minutes 3306/tcp mysql
いい感じっぽい。
MySQLは動いてるんだろうか?
php:customで作ったコンテナに入って、/etc/hosts/を確認してみると、MySQLの情報があるっぽい。
docker exec -ti php bash
cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 mysql 2df3c79ac7b2
172.17.0.3 <phpが動いてるコンテナのID>
ふむふむ。mysql含まれてるからいいっぽい。
composerインストール
phpの依存関係とかをアレするツールとして、composerをphpコンテナに入れる。
どうやんの。
この辺を参考に。
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
あとunzipとか入ってねえな、、、要る。
apt-get install zip
これY/nでるんで困ってるんだけどDockerfileとかで自動化するにはどうすればいいの。
Laravelでの最初のプロジェクト作り
composer global require "laravel/installer=~1.1"
composer create-project laravel/laravel MyFirstLaravel
行けたっぽさがある。
で、とりあえずMySQLとかの設定をしないといけないが、無視してアクセスしてみよう。
127.0.0.1では、Apacheの設定を放置したままなのでforbiddenが見えてる状態。
で。ここから、設定を変更していく。
・Apacheのデフォルトを、Laravelのデフォルトパスへと変更
・MySQLのIPの指定
設定はMyFirlstLaravelのフォルダにあるっぽい
.envファイルがそれ。
まず、ホストからLaravelのindexにアクセスできるようにしてみよう。
Apacheのデフォルトアクセスパスを、Laravelのデフォルトを指すように変更する。
apacheの該当設定のconfは以下にあるはず。
/etc/apache2/sites-available/000-default.conf
このファイルを一度hostへとコピーして、もう一度コンテナへとコピー。
docker cp <phpが動いてるコンテナのID>:/etc/apache2/sites-available/000-default.conf /Users/tartetatin/Desktop/LaravelServer/apache2/000-default.conf
で、コピッてきたconfの該当行を書き換える。
DocumentRoot /var/www/html/MyFirstLaravel/public
編集したファイルをコピーでHost -> Containerへと戻して、
docker cp /Users/tartetatin/Desktop/LaravelServer/apache2/000-default.conf <phpが動いてるコンテナのID>:/etc/apache2/sites-available/000-default.conf
phpの動いてるコンテナで、apacheの再起動
apachectl -k graceful
これで、apacheへとアクセスした時に、Laravelのパスへとアクセスできるようになった。
127.0.0.1にアクセスすると、確かにいい感じにインデックス表示された。まだMySQL動いてないんだけど。
このコンフィグいじるとかその辺もなんかDockerfileに書き込めるといいんだろうなあ。と思うが面倒臭いのでいい。
MySQLの設定
次に、MySQLのパスを指定してみる。どうせなんか必要なんだろうし。、、必要なのか?
laravelの.envを書き換えればいいんだと思う。まあ面倒だから一度この辺で帰ろう。